#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>
void multi_sink_example() {
 //创建一个标准输出的落地方向对象
 auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
 //该方向仅允许 warn 等级以上的日志输出
 console_sink->set_level(spdlog::level::warn);
 console_sink->set_pattern("[multi_sink_example] [%^%l%$] %v");
 //创建一个文件输出的落地方向对象
 auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/multisink.txt", true);
 //该方向允许 trace 等级以上的日志输出
 file_sink->set_level(spdlog::level::trace);
 //构造一个日志器对象，用于输出日志
 spdlog::logger logger("multi_sink", {console_sink, file_sink});
 //每个日志器都可以设置初步过滤等级，其次内部每个 sink 也可以设置自己独立的过滤等级
 logger.set_level(spdlog::level::debug);
 logger.set_pattern("%Y-%m-%d %H:%M:%S [%l] %v");
 logger.warn("this should appear in both console and file");
 logger.info("this message should not appear in the console, only in the file");
} 
void async_example() {
 //void init_thread_pool(size_t q_size, size_t thread_count);
 spdlog::init_thread_pool(32768, 1);//设置默认线程池属性信息
 //通过工厂模式创建异步日志记录器的同时，会在内部创建默认线程池作为异步线程
 auto async_logger = spdlog::basic_logger_mt<spdlog::async_factory>("async_file_logger", "logs/async_log.txt");
 async_logger->set_pattern("%Y-%m-%d %H:%M:%S [%l] %v");
 for (int i = 1; i < 101; ++i) {
 //需要注意的是，在多参数的时候，spdlog 并非使用 %s %d 这种通配符来匹配参数
 //而是使用 {}, spdlog 可以自己识别数据类型
 async_logger->info("Async message #{} {}", i, "hello");
 } 
} 
int main()
{ 
 //multi_sink_example();
 async_example();
 return 0;
}